﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using consultasSql.consultasVarias;

/// <summary>
/// Descripción breve de CEmail
/// </summary>

namespace email
{
    public class CEmail
    {
        private string SMTP;
        private int Puerto;
        private string Usuario;
        private string Pass;
        private bool Ssl;


        public string dirMailEnviar { get; set; }
        public string Asunto { get; set; }
        public string Contenido { get; set; }



        private bool cargarCampos()
        {
            bool bandera = false;
            try
            {
                string consulta = "SELECT Usuario, Pass, Smtp, Puerto, Ssl FROM EMail";

                SqlCommand command = new SqlCommand();

                command.CommandType = CommandType.Text;
                command.CommandText = consulta;

                command.Parameters.Clear();

                DataTable tabla = new CDarDataSet().darDataTable(command);

                Usuario = tabla.Rows[0][0].ToString();

                string passw = desencriptar(tabla.Rows[0][1].ToString());

                if (!String.IsNullOrEmpty(passw))
                {
                    Pass = passw;
                }
                else
                {
                    return false;
                }
                
                SMTP = tabla.Rows[0][2].ToString();
                Puerto = Convert.ToInt32(tabla.Rows[0][3].ToString());

                if (tabla.Rows[0][4].ToString().Equals("True"))
                {
                    Ssl = true;
                }
                else
                {
                    Ssl = false;
                }

                bandera = true;
            }
            catch 
            {
                bandera = false;
            }

            return bandera;

        }

        //desencripto la contraseña
        private string desencriptar(string encr)
        {
            string dato = null;
            int num;

            try
            {
                foreach (char car in encr)
                {
                    num = Convert.ToInt32(car) + 10;
                    dato = dato + Convert.ToChar(num);
                }
            }
            catch
            {
                dato = null;
            }

            return dato;
        }

        //envio mail sin adjuntar nada
        public bool enviarEmail()
        {
            bool bandera = false;

            if (cargarCampos())
            {
                if (sendMail(this.asignarDatosMail()))
                {
                    bandera = true;
                }
            }

            return bandera;
        }

        //adjuntar y enviar pdf
        public bool enviarEmailAdjuntoPdf(MemoryStream streamPdf)
        {
            bool bandera = false;

            if (cargarCampos())
            {
                if (this.agregarArchivoAdjuntoMail(streamPdf))
                {
                    bandera = true;
                }
            }

            return bandera;
        }

        //adjuntar pdf
        private bool agregarArchivoAdjuntoMail(MemoryStream streamPdf)
        {
            bool bandera = false;

            try
            {
                using (Attachment _Attachment = new Attachment(streamPdf, MediaTypeNames.Application.Pdf))
                {
                    _Attachment.Name = "Remito.pdf";

                    using (MailMessage correo = this.asignarDatosMail())
                    {
                        correo.Attachments.Add(_Attachment);

                        if (this.sendMail(correo))
                            bandera = true;
                    }
                }

                streamPdf.Close();
            }
            catch
            {
                bandera = false;
            }

            return bandera;
        }


        //cargar datos mail
        private MailMessage asignarDatosMail()
        {
            MailMessage correo = new MailMessage();

            correo.From = new MailAddress(this.Usuario);
            correo.Subject = this.Asunto;
            correo.To.Add(this.dirMailEnviar);
            correo.Body = this.Contenido;
            correo.IsBodyHtml = false;
            correo.Priority = MailPriority.Normal; //Prioridad

            return correo;
        }


        //enviar mail
        private bool sendMail(MailMessage correo)
        {
            bool bandera = false;

            //Configuracion del servidor
            using (SmtpClient Servidor = new SmtpClient())
            {
                Servidor.Host = this.SMTP;
                Servidor.Port = this.Puerto;
                Servidor.EnableSsl = Ssl;//si es otro mail que no sea gmail, puede que deba ser puesto en false
                Servidor.Credentials = new NetworkCredential(this.Usuario, this.Pass);

                try
                {
                    Servidor.Send(correo);
                    bandera = true;
                }
                catch
                {
                    bandera = false;
                }
            }
            return bandera;
        }



    }
}